package br.unesp.demac.bcc.soo.sistemaclarus.dao;

import br.unesp.demac.bcc.soo.sistemaclarus.bean.Aluno;
import br.unesp.demac.bcc.soo.sistemaclarus.bean.Usuario;
import br.unesp.demac.bcc.soo.sistemaclarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Evaldo
 */
public class UsuarioDAOImp {

    /**
     * Salva dados do usário
     * @param usu Usuário a ser inserido
     * @param alun Aluno a ser inserido
     * @return Status da inserção
     * @throws SQLException Execeção SQL
     */
    public boolean salvarUsuario(Usuario usu, Aluno alun) throws SQLException {
        boolean salvo = false;
        int idUsuario = 0;

        final String query = "INSERT INTO usuario (nome) VALUES (?);";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement pstmt = null;
        ResultSet res = null;

        if (conn != null) {
            try {
                conn.setAutoCommit(false);

                //inserindo dados em Usuario
                pstmt = conn.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
                pstmt.setString(1, usu.getNome());
                pstmt.executeUpdate();
                res = pstmt.getGeneratedKeys();

                if (res.next()) {
                    idUsuario = res.getInt(1);
                }

                //inserindo dados em Aluno
                AlunoDAOImp alunDao = new AlunoDAOImp();
                alunDao.salvarAluno(conn, alun, idUsuario);

                //inserindo dados em Login
                LoginDAOImp loginDao = new LoginDAOImp();
                loginDao.salvarLogin(conn, usu.getLogin(), idUsuario);

                conn.commit();
                salvo = true;
            } catch (SQLException ex) {
                System.out.println("Erro ao salvar usuário: " + ex.getMessage());
                throw ex;
            } finally {
                FabricaConexao.fechar(conn, pstmt);
            }
        }

        return salvo;
    }
}
